www.gusucode.com > 用于人脸识别和人脸定位的主动形状模型(asm)matlab工具箱 > asm toolbox\asm.m
%%%%%%%%%%%%%%%%%%%%%%%%%% %(c) Ghassan Hamarneh 1999 %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Based on (unless otherwise stated): %%% %%% Active Contour Models--Their Training & Application %%% T.F.Cootes, C.J.Taylor, et.al. %%% Computer Vision and Image Understanding, %%% Vol.61 No.1,January pp.38-59, 1995 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% and for the multiresolution part: %%% %%% Active Shape Models: Evaluation of a Multi-Resolution Method %%% for Improving Image Search %%% %%% T.F.Cootes, C.J.Taylor, A.Lanitis %%% Proc. British Machine Vision Conference, vol. 1 , %%% 1994, Ed.E.Hancock BMVA Press. pp327-336 %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %%% Programming by: %%% Ghassan Hamarneh %%% Image Analysis Group %%% CHALMERS UNIVERSITY OF TECHNOLGY %%% %%% Currently at: %%% Computing Science %%% Simon Fraser University %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %%% On 991006 the following fixes where made: %%% 1. using the function landmark(..) so you can see/delete landmarks when labeling %%% 2. specify percentage of explained variance instead of numnber of eigen vectors %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %%% July 19, 2004: added ExplainPercent to the saved training variables %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LABEL_DATA_EXIST=0; %LABEL_DATA_EXIST=1; %for loading DTU labelled data % ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %Using uiwait and helpdlg uiwait(helpdlg({'A C T I V E S H A P E M O D E L S' ... ' with Multi-Resolution statistics ' ''... 'By ... ' '' 'Ghassan Hamarneh' '' ['done: 11-Aug-1997 -- today: ',date] },'ASM')); %help information uiwait(helpdlg({'HELP INFORMATION:',... '',... ' .I. This Program is divided into 3 main stages:',... ' you can choose to skip any one of them',... ' 1 TRAINING ',... ' 2 TRYING WEIGHTS ',... ' 3 APPLICATION ',... '',... ' .II. Follow the instructions in the dialog boxes.',... '',... '.III. Click Cancel in any dialog box to quit.',... '',... },'ASM')); ButtonName=questdlg('Do you want to train?','ASM'); DidTrain=ButtonName; if(strcmp(ButtonName,'Cancel')) msgbox('Terminating: cancelled request to train.','ASM'); return; elseif (strcmp(ButtonName,'Yes')) %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TRAINING STAGE %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Number of shapes in training set = NumTrnSetImgs %Number of landmark points = NumLandMarkPts %Number of dimensions = D = 2 uiwait(helpdlg('THIS IS THE FIRST STAGE: TRAINING STAGE.','ASM')); uiwait(helpdlg('Now, you will enter some initialization information used for training.','ASM')); %Using the inputdlg prompt={'Enter Contours Ending Points. (Last entry is no. of landmarks, ex. [8 16 27])',... 'Enter The number of training set images (2,3,4,..):',... 'Enter Percentage of explained vaiance (0-1):',... 'Enter Number of points along training profile above landmark (1,2,3,...):',... 'Enter Number of points along training profile below landmark (1,2,3,...):'}; def={'[76 93 110 157 222 239 253 261 269]','3','0.90','3','3'}; TheTitle='ASM'; lineNo=[1,1,1,1,1]; answer=inputdlg(prompt,TheTitle,lineNo,def); if isempty(answer) msgbox('Terminating: cancelled inputing initialization info. for training','ASM'); return; end ContoursEndingPoints=str2num(answer{1}); NumTrnSetImgs = str2num(answer{2}); ExplainPercent= str2num(answer{3}); TrnPntsAbove = str2num(answer{4}); TrnPntsBelow = str2num(answer{5}); NumLandMarkPts=ContoursEndingPoints(end); %NOTE: %------ %ContoursEndingPoints,NumTrnSetImgs,NumLandMarkPts %will be overwritten if labelled data already exist and will be loaded %as in DTU data %STEP 1 ----------------- %Obtain landmark coordinates for each shape in the training set %Result: 'unaligined training set shape coordinates' matrix Xu with rows=2*NumLandMarkPts & cols=NumTrnSetImgs % remove remark of next 3 lines >>>>>> uiwait(helpdlg('Now, you will select the landmark points in the training images.','ASM')); if LABEL_DATA_EXIST==1, [Xu,TrnImgFiles,ContoursEndingPoints,NumTrnSetImgs,NumLandMarkPts]=GetTrnSetCoor2; else [Xu,TrnImgFiles]=GetTrnSetCoor(NumTrnSetImgs,NumLandMarkPts); end if Xu==0 msgbox('Terminating: cancelled loading images','ASM'); return; end % <<<<<<<< remove remark of prev 3 lines figure PlotShapes(Xu,'ASM: unaligined training set',ContoursEndingPoints); %STEP 1.1 ----------------- %Calculate the Mean Normalized Derivative Profile for each landmark point %RESULT: a 2D array of NumLandMarkPts Profiles %Calculate the covariance matrix of the Mean Normalized Derivative Profiles for each landmark %RESULT: a cell array of squares arrays of length (1+TrnPntsAbove+TrnPntsBelow)-1 MaxNumPyramidLevels=GetMaxNumPyramidLevels(TrnImgFiles); uiwait(msgbox(['Using ',num2str(MaxNumPyramidLevels),' levels in image pyramid'],'ASM')); uiwait(msgbox(['The image intensity training profile statistics will now be collected'],'ASM')); [MnNrmDrvProfiles,ProfilesCov]=GetProfileStatistics(TrnImgFiles,Xu,TrnPntsAbove,TrnPntsBelow,ContoursEndingPoints,MaxNumPyramidLevels); %STEP 2 ----------------- %Find the weighting matrix to give more significance to those points which tend to be stable %RESULT: 'landmark points weighting matrix' square matrix W with rows=cols=NumLandMarkPts uiwait(helpdlg({'Now, the weighting matrix will be calculated,'... 'the shapes will be aligned and' ... 'the training set statistics will be obtained.'},'ASM')); W=GetWeights(Xu); %STEP 3 ----------------- %Align the shapes of the training set using the obtained coordinates %RESULT: 'aligned training set shape coordinates' matrix Xa Xa=AlignTrnSetCoor(Xu,W,ContoursEndingPoints); figure PlotShapes(Xa,'ASM: aligined training set',ContoursEndingPoints); %STEP 4 ----------------- %Obtaining the statistical description of the training set shape coordinates %REUSLT: 'Statistical Model x=xm + P*b' where, % xm: coordinates of mean shape -> 2*NumLandMarkPts x 1 % P: matrix of first t eigenvectors of covariance matrix -> 2*NumLandMarkPts x t % b: vector of weights -> t x 1 [MeanShape,tEigenvectors,tEigenValues]=GetShapeStatistics(Xa,ExplainPercent); ButtonName=questdlg('Do you want to save training results','ASM'); if(strcmp(ButtonName,'Cancel')) msgbox('Terminating: cancelled request to save training results','ASM'); return; elseif (strcmp(ButtonName,'Yes')) ExplainPercent %useful to use in filename when saving TrnPntsAbove %useful to use in filename when saving TrnPntsBelow %useful to use in filename when saving [newmatfile, newpath] = uiputfile('*.mat', 'ASM: Save as...'); if(newmatfile==0)msgbox('Terminating: cancelled entering .mat file name for save','ASM'); return; end save([newpath,newmatfile],'MeanShape','tEigenvectors','tEigenValues','W','ContoursEndingPoints',... 'MnNrmDrvProfiles','ProfilesCov','TrnPntsBelow','TrnPntsAbove','MaxNumPyramidLevels','ExplainPercent'); end end if (~strcmp(DidTrain,'Yes')) %if did not do training uiwait(helpdlg('Since you chose no training, you will have to load a previous data (.mat) file.','ASM')); [fname,pname]=uigetfile('*.mat','ASM: choose *.mat file to load'); if fname==0; msgbox('Terminating: cancelled loading data (.mat) file','ASM'); return; end load([pname,fname]) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TRY WEIGHTS %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% ButtonName=questdlg('Do you want to animate modes of variation?','ASM'); if(strcmp(ButtonName,'Cancel')) msgbox('Terminating: cancelled animating modes of variation.','ASM'); return; elseif (strcmp(ButtonName,'Yes')) %animating modes of variation b in X=M+Pb uiwait(helpdlg('THIS IS THE SECOND STAGE: TRYING WEIGHTS: Animating.','ASM')); uiwait(helpdlg('Now, you will choose a mode of variation and a range of weights in X = Xmean + P*b.','ASM')); TerminateNotContinue = TryWeights2(MeanShape,tEigenvectors,tEigenValues,ContoursEndingPoints); if TerminateNotContinue msgbox('Terminating: cancelled trying weights','ASM'); return; end end ButtonName=questdlg('Do you want to try weights?','ASM'); if(strcmp(ButtonName,'Cancel')) msgbox('Terminating: cancelled request to try weights.','ASM'); return; elseif (strcmp(ButtonName,'Yes')) %trying different weights b in X=M+Pb uiwait(helpdlg('THIS IS THE SECOND STAGE: TRYING WEIGHTS: Entering weights.','ASM')); uiwait(helpdlg('Now, you will enter different weight values for b in X = Xmean + P*b.','ASM')); TerminateNotContinue = TryWeights(MeanShape,tEigenvectors,tEigenValues,ContoursEndingPoints); if TerminateNotContinue msgbox('Terminating: cancelled trying weights','ASM'); return; end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% APPLICATION STAGE %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% ButtonName=questdlg('Do you want to search for a shape in an image?','ASM'); if(strcmp(ButtonName,'Cancel')) msgbox('Terminating: cancelled request to search for a shape.','ASM'); return; elseif (strcmp(ButtonName,'Yes')) uiwait(helpdlg('THIS IS THIRD STAGE: APPLICATION STAGE.','ASM')); uiwait(helpdlg('Now, you will choose an image to search and enter some initialization information','ASM')); TerminateNotContinue=FindShapeInImage(MeanShape,tEigenvectors,tEigenValues,W,ContoursEndingPoints,... MnNrmDrvProfiles,ProfilesCov,TrnPntsBelow,TrnPntsAbove,MaxNumPyramidLevels); if TerminateNotContinue msgbox('Terminating: cancelled searching image','ASM'); return; end end msgbox('Done!','ASM');